<?PHP
/**
 * mysql 基类,完成数据库的基本操作
 * 所有方法中,如没有错误,则返回0作相关的付值,否则返回错误信息,错误信息在language里面定义的国际化常量
 * 
 * @copyright Copyright (c) 2008 sdmblog (http://www.sdmblog.cn)
 * @author sdomain(sdomain@live.cn)
 * @version mysql.cls.php Sat May 17 17:48:12 CST 2008 php $
 */
if(!defined('SDOMAIN')) die('Error to get this file!');
class DB_CLASS{
	var $linkId 	= 0;
	var $errorString= '';
	var $errorNo	= 0;
	var $result		= array();
	var $queryId	= 0;
	var $queryNum	= 0;
	var $numRows	= 0;
	var $queryString='';
	/*
	数据库连接
	$db_type: 要连接的数据库类型
	$db_id:数据库序列
	成功返回0否则返回错误信息
	*/
	function connect($dbconfig){
		global $lang;
		$linkId=@mysql_connect($dbconfig['dbhost'],$dbconfig['dbuser'],$dbconfig['dbpassword']);
		unset($GLOBALS['dbconfig']);
		if(!$linkId){
			$this->errorString	= mysql_error();
			$this->errorNo		= mysql_errno();
			$error = $lang[DB_ERROR_0001].$this->errorString;
			throw new Exception($error);
		}else{
			$this->linkId=$linkId;
			if(mysql_select_db($dbconfig['dbname'],$linkId)){
				$this->query("set names 'utf8'");
				return 0;
			}else{
				$error = $lang[DB_ERROR_0002].$this->errorString;
				throw new Exception($error);
			}
		}
	}
	
	/*
	数据库查询,包括查询/更新/添加/删除
	$query=操作语句
	成功返回0并更新自身的相关属性.否则返回错误信息
	*/
	function query($query, $linkId=0){
		global $lang;
		if ($linkId == 0) {
			$linkId = $this->linkId;
		}
		if ($linkId == 0) {
			$error = $lang[DB_ERROR_0003];
			throw new Exception($error);
		}
		$this->queryNum++;
		$this->queryString = $query;
		$queryId = mysql_query($query, $linkId);
		$this->errorString	= mysql_error();
		$this->errorNo		= mysql_errno();
		
		if (!$queryId){
			$tmp = substr($query, 0, 6);
			if (eregi('select', $tmp)) $error = $lang[DB_ERROR_0004];
			else if (eregi('insert', $tmp)) $error = $lang[DB_ERROR_0005];
			else if (eregi('update', $tmp)) $error = $lang[DB_ERROR_0006];
			else if (eregi('delete', $tmp)) $error = $lang[DB_ERROR_0007];
			else $error = $lang[DB_ERROR_0008];
			//如果出错，则抛出错误，以方便在AJAX里面作错误处理
			$error .= ':'.$this->errorNo.':'.$this->errorString.' querySQL:'.$this->queryString;
			throw new Exception($error);
		}
		$this->db_num_rows($queryId);
		$this->queryId = $queryId;
		return 0;
	}
	
	/*
	得到数据库查询后影响的行数
	$queryId=查询返回的结果
	返回影响的行数
	*/
	function db_num_rows($queryId){
		$this->numRows = @mysql_num_rows ($queryId);
		return $this->numRows;
	}
	
	/*
	把查询结果集放到数组内
	$queryId=查询返回的结果
	返回数组
	*/
	function &db_fetch_row($queryId=0){
		if ($queryId == 0) {
			$queryId = $this->queryId;
		}
		$ar = mysql_fetch_row($queryId);
		return $ar;
	}


	/*
	返回结果中各字段到数组里
	$queryId=查询返回的结果
	*/
	function &db_fetch_array($queryId=0){
		if ($queryId == 0) {
			$queryId = $this->queryId;
		}
		$ar = @mysql_fetch_array($queryId);
		return $ar;
	}


	/*
	查询第一条记录,并把结果保存到result中
	$queryId=查询返回的结果
	成功返回0否则返回错误信息
	*/	
	function db_query_one($query, $linkId=0){
		global $lang;
		if ($linkId == 0) {
			$linkId = $this->linkId;
		}
		if ($linkId == 0) {
			return $lang[DB_ERROR_0003];
		}
		
		$error = $this->query($query, $linkId);
		$this->result = $this->db_fetch_array();////////////////////
		return $this->db_free_result();
		return 0;
	}
	
	/**
	 * 得到某一条记录的某个字段的值
	 * 
	 * @param int $i 结果的行数
	 * @param string $field 可以是字段顺序等
	 * @param int $queryId 查询返回的结果
	 * 
	 * @return mix 返回指定字段的值
	 */
	function db_result($i, $field, $queryId=0){
		if ($queryId==0) {
			$queryId = $this->queryId;
		}
		
		return mysql_result($queryId, $i, $field);
	}

	/**
	 * 移动结果中的指针到指定行
	 * 
	 * @param int $queryId 查询返回的结果
	 * @return int 返回新的queryid 出错时返回错误信息
	 */
	function db_data_seek($row, $queryId=0) {
		global $lang;
		if ($queryId==0) {
			$queryId = $this->queryId;
		}
		
		$res = mysql_data_seek($queryId, $row);
		if (!$res){
			return $lang[DB_ERROR_0009];
		}
		$this->queryId = $queryId;
		return 0;
	}

	/**
	 * 回最后一次使用 INSERT 指令的 ID
	 * 用于取编号用
	 * 
	 * @return int 返回编号
	 */	
	function db_insert_id(){
		return @mysql_insert_id();
		
	}

	/**
	 * 释放目前 MySQL 数据库 query 返回所占用的内存.
	 * 查询完毕后一定要使用此函数进行释放内存,因为接下来可能还要连很多库,程序并没结束,无法自动释放内存
	 * 
	 * @param int $queryId 查询返回的结果
	 * @return int 返回0
	 */
	function db_free_result($queryId=0){
		if ($queryId == 0) {
			$queryId = $this->queryId;
		}
		if ($queryId)	@mysql_free_result();
		return 0;
	}
	
	/**
	 * 关闭数据库连接,在一个连接处理完所有事务时,关闭他
	 * 
	 * @param  int $linkId数据库连接
	 * @return int 返回0
	 */
	function db_close($linkId=0){
		if ($linkId == 0) {
			$linkId = $this->linkId;
		}
		mysql_close($linkId);
		$this->linkId = 0;
		return 0;
	}

}
?>